package Model;

import java.awt.Color;
import java.util.ArrayList;
import java.util.Random;

import Control.Kontroller;



/**
 * 
 * A játék legfontosabb dinamikus entitása, a specifikációnak megfelelően véletlenszerűen mozog a pályán kaját keresve, szagnyomokat követve.
 * Ha egy mezőre lép hangyalesővel, hangyászsünnel, étellel vagy ölőspray-el akkor meghal.
 * Emlékszik arra, hogy legutoljára melyik mező felől érzett szagot (csak a legutoljára érzett szag érdekli).
 *
 */

public class Hangya extends MozgoDinEntitas
{
	private Mezo honnanJottem;
	/** Az a Mező, ahonnan legutoljára Szagot érzett a Hangya. */
	private Mezo legutobbiHangyaSzagMerre;
	
	/**
	 * A Hangya osztály paraméteres konstruktora.
	 * @param ny Referencia egy INyilvántartó interfészt megvalósító objektumra.
	 */
	public Hangya(INyilvantarto ny)
	{
		super(ny);
		color = Color.BLACK;
	}

	/**
	 * Eltávolítja magát a Játéktérről (és elvégzi az ehhez szükséges adminisztrációt).
	 */
	public void meghal()
	{
		if(holvagyok != null) {
		holvagyok.levesz(this);
		holvagyok = null;
		nyilvantarto.leiratkozas(this);
		}
	}

	/**
	 * A Hangya a hívás után meghal, mert Hangyászsünnel van egy Mezőn és ekkor az megeszi.
	 * @param hsun Egy idelépő, vagy ittlévő Hangyászsün.
	 */
	public void ittVan(HangyaszSun hsun)
	{
		// 20. szekvenciadiag alapján
		this.meghal();
		hsun.megevett++;
	}

	/**
	 * A Hangya a hívás után a kapott Szag Mezője felől érez majd Szagot.
	 * @param sz Egy a közelben lévő Szag.
	 */
	public void ittVan(Szag sz)
	{
		legutobbiHangyaSzagMerre = sz.holvagyok;
	}

	/**
	 * A Hangya a hívás után meghal, mert megöli az ÖlőSpray.
	 * @param olo Egy Mezőre került, vagy már ottlévő ÖlőSpray.
	 */
	public void ittVan(OloSpray olo)
	{
		this.meghal();
	}

	/**
	 * A Hangya saját tick függvénye, ebben végzi el a szükséges dolgokat a lépéshez.
	 */
	public void tick()
	{
		ArrayList<Mezo> sz = holvagyok.getSzomszedok();
		if(Kontroller.veletlenEsemenyek)
		{// vannak veletlenek
			//merre van az elore?	
			
			Mezo elore = null;
			if(getHonnanJottemIde() == null) {
				elore = sz.get(0);
			}
			else {
				 int innenJottem = sz.indexOf(getHonnanJottemIde());
				 elore = sz.get((innenJottem+3)%6);//erre, ne kerdezd
			}
			
			Random randomFactory = new Random();
			
			//szagnyom fele 0-49 ( ha nincs elore )
			//etel fele 50-79 
			//elore 80-94
			//1,2,3,4,5 mezok: 95,96,97,98,99
			int merre = randomFactory.nextInt(100);
			
			if(merre<20)
			{
				//szagnyom fele
				if(legutobbiHangyaSzagMerre != null) {
					kovetkezoMezo = legutobbiHangyaSzagMerre;
				}
				else{// ha nincs szagnyom elore
					kovetkezoMezo = elore;
				}
			} else if(merre<50)
			{
				//etel fele
				kovetkezoMezo = holvagyok.getLegkozelebbiKajaIranya();
			} else if(merre<95)
			{
				//elore
				kovetkezoMezo = elore;
			} else
			{
				//maradek
				kovetkezoMezo = sz.get(randomFactory.nextInt(6));
			}
			
		}
		else kovetkezoMezo = sz.get(0);
		
		Random randomFactory = new Random();
		
		if(honnanJottem == kovetkezoMezo) {
			kovetkezoMezo = sz.get(randomFactory.nextInt(6));
		}
		
		if(kovetkezoMezo != null)
		{
			Szag szag = new Szag(this.nyilvantarto);
			szag.iderak(holvagyok);
			holvagyok.ittVan(szag);
			kovetkezoMezo.ittVan(this);
			// Kinullazzuk a hangyaszagot, es lepunk
			legutobbiHangyaSzagMerre = null;
			honnanJottem = kovetkezoMezo;
			lep();
			
		}
		else holvagyok.ittVan(this);
	}
	
	public String kiir()
	{
		return "H(" + azonosito + ")";
	}
}